home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / share / pyshared / PIL / TgaImagePlugin.py < prev    next >
Text File  |  2006-12-03  |  3KB  |  134 lines

  1. #
  2. # The Python Imaging Library.
  3. # $Id: TgaImagePlugin.py 2134 2004-10-06 08:55:20Z fredrik $
  4. #
  5. # TGA file handling
  6. #
  7. # History:
  8. # 95-09-01 fl   created (reads 24-bit files only)
  9. # 97-01-04 fl   support more TGA versions, including compressed images
  10. # 98-07-04 fl   fixed orientation and alpha layer bugs
  11. # 98-09-11 fl   fixed orientation for runlength decoder
  12. #
  13. # Copyright (c) Secret Labs AB 1997-98.
  14. # Copyright (c) Fredrik Lundh 1995-97.
  15. #
  16. # See the README file for information on usage and redistribution.
  17. #
  18.  
  19.  
  20. __version__ = "0.3"
  21.  
  22. import Image, ImageFile, ImagePalette
  23.  
  24.  
  25. def i16(c):
  26.     return ord(c[0]) + (ord(c[1])<<8)
  27.  
  28. def i32(c):
  29.     return ord(c[0]) + (ord(c[1])<<8) + (ord(c[2])<<16) + (ord(c[3])<<24)
  30.  
  31.  
  32. MODES = {
  33.     # map imagetype/depth to rawmode
  34.     (1, 8):  "P",
  35.     (3, 1):  "1",
  36.     (3, 8):  "L",
  37.     (2, 16): "BGR;5",
  38.     (2, 24): "BGR",
  39.     (2, 32): "BGRA",
  40. }
  41.  
  42.  
  43. def _accept(prefix):
  44.     return prefix[0] == "\0"
  45.  
  46. ##
  47. # Image plugin for Targa files.
  48.  
  49. class TgaImageFile(ImageFile.ImageFile):
  50.  
  51.     format = "TGA"
  52.     format_description = "Targa"
  53.  
  54.     def _open(self):
  55.  
  56.         # process header
  57.         s = self.fp.read(18)
  58.  
  59.         id = ord(s[0])
  60.  
  61.         colormaptype = ord(s[1])
  62.         imagetype = ord(s[2])
  63.  
  64.         depth = ord(s[16])
  65.  
  66.         flags = ord(s[17])
  67.  
  68.         self.size = i16(s[12:]), i16(s[14:])
  69.  
  70.         # validate header fields
  71.         if id != 0 or colormaptype not in (0, 1) or\
  72.            self.size[0] <= 0 or self.size[1] <= 0 or\
  73.            depth not in (8, 16, 24, 32):
  74.             raise SyntaxError, "not a TGA file"
  75.  
  76.         # image mode
  77.         if imagetype in (3, 11):
  78.             self.mode = "L"
  79.             if depth == 1:
  80.                 self.mode = "1" # ???
  81.         elif imagetype in (1, 9):
  82.             self.mode = "P"
  83.         elif imagetype in (2, 10):
  84.             self.mode = "RGB"
  85.             if depth == 32:
  86.                 self.mode = "RGBA"
  87.         else:
  88.             raise SyntaxError, "unknown TGA mode"
  89.  
  90.         # orientation
  91.         orientation = flags & 0x30
  92.         if orientation == 0x20:
  93.             orientation = 1
  94.         elif not orientation:
  95.             orientation = -1
  96.         else:
  97.             raise SyntaxError, "unknown TGA orientation"
  98.  
  99.         if imagetype & 8:
  100.             self.info["compression"] = "tga_rle"
  101.  
  102.         if colormaptype:
  103.             # read palette
  104.             start, size, mapdepth = i16(s[3:]), i16(s[5:]), i16(s[7:])
  105.             if mapdepth == 16:
  106.                 self.palette = ImagePalette.raw("BGR;16",
  107.                     "\0"*2*start + self.fp.read(2*size))
  108.             elif mapdepth == 24:
  109.                 self.palette = ImagePalette.raw("BGR",
  110.                     "\0"*3*start + self.fp.read(3*size))
  111.             elif mapdepth == 32:
  112.                 self.palette = ImagePalette.raw("BGRA",
  113.                     "\0"*4*start + self.fp.read(4*size))
  114.  
  115.         # setup tile descriptor
  116.         try:
  117.             rawmode = MODES[(imagetype&7, depth)]
  118.             if imagetype & 8:
  119.                 # compressed
  120.                 self.tile = [("tga_rle", (0, 0)+self.size,
  121.                               self.fp.tell(), (rawmode, orientation, depth))]
  122.             else:
  123.                 self.tile = [("raw", (0, 0)+self.size,
  124.                               self.fp.tell(), (rawmode, 0, orientation))]
  125.         except KeyError:
  126.             pass # cannot decode
  127.  
  128. #
  129. # registry
  130.  
  131. Image.register_open("TGA", TgaImageFile, _accept)
  132.  
  133. Image.register_extension("TGA", ".tga")
  134.